package br.edu.ufcg.dsc.lp2.projeto.tests.model;

import org.junit.Assert;

import java.util.ArrayList;
import java.util.List;

import org.junit.Before;
import org.junit.Test;

import br.edu.ufcg.dsc.lp2.projeto.model.Estabelecimento;
import br.edu.ufcg.dsc.lp2.projeto.model.Usuario;
import br.edu.ufcg.dsc.lp2.projeto.model.exceptions.EnderecoInvalidoException;
import br.edu.ufcg.dsc.lp2.projeto.model.exceptions.EstabelecimentoInvalidoException;
import br.edu.ufcg.dsc.lp2.projeto.model.exceptions.NomeInvalidoException;
import br.edu.ufcg.dsc.lp2.projeto.model.exceptions.NotaInvalidaException;
import br.edu.ufcg.dsc.lp2.projeto.model.exceptions.NullParameterException;

public class UsuarioTest {

	@Before
	public void setUp() throws EnderecoInvalidoException {
		this.laSuissaEstabelecimento = new Estabelecimento("La Suissa",
				"Rua Irineu Joffili", "A la carte");
        
	    estabelecimentos = new ArrayList<Estabelecimento>();
	    estabelecimentos.add(laSuissaEstabelecimento);
		this.jobimUsuario = new Usuario("Tom Jobim", estabelecimentos);
	}
	
	
	@Test
	public void testUsuario() {
		Assert.assertEquals("Tom Jobim", jobimUsuario.getNome());
		Assert.assertTrue((jobimUsuario.getOpiniao()).containsKey(laSuissaEstabelecimento));
	}

	@Test(expected = NomeInvalidoException.class)
	public void testUsuarioNomeNull() {
		new Usuario(null, estabelecimentos);
	}
	
	@Test(expected = NullParameterException.class)
	public void testEstabelecimentosNull() {
		new Usuario("Monica", null);
	}
	
	@Test(expected = EstabelecimentoInvalidoException.class)
	public void testAdicionaOpiniaoEstabelecimentoNull() {
		this.jobimUsuario.adicionaOpiniao(null, 1);
	}

	@Test(expected = NotaInvalidaException.class)
	public void testAdicionaOpiniaoNotaInvalida() {
		this.jobimUsuario.adicionaOpiniao(laSuissaEstabelecimento, -6);
	}
		
	@Test
	public void testAdicionaOpiniao() {
		Assert.assertTrue(jobimUsuario.getOpiniao().containsKey(
				laSuissaEstabelecimento));
		this.jobimUsuario.adicionaOpiniao(laSuissaEstabelecimento, 3);
		Assert.assertTrue("Erro: Opiniao nao adicionada", jobimUsuario
				.getOpiniao().containsKey(laSuissaEstabelecimento));
		Assert.assertEquals("Erro: Nota errada", 3, jobimUsuario
				.getOpiniao().get(laSuissaEstabelecimento).intValue());
	}	

	@Test
	public void testGetNota() {
		Assert.assertEquals("Erro: Nota errada", 0,
				this.jobimUsuario.getNota(laSuissaEstabelecimento));
		this.jobimUsuario.adicionaOpiniao(laSuissaEstabelecimento, 3);
		Assert.assertEquals("Erro: Nota errada", 3,
				this.jobimUsuario.getNota(laSuissaEstabelecimento));
		jobimUsuario.adicionaOpiniao(laSuissaEstabelecimento, 5);
		Assert.assertEquals("Erro: Nota errada", 5, 
				jobimUsuario.getNota(laSuissaEstabelecimento));
	}
	
	private Estabelecimento laSuissaEstabelecimento;
	private Usuario jobimUsuario;
    private List<Estabelecimento> estabelecimentos;
}
